package examples

import (
	"context"
	"fmt"
	"log"

	"gitee.com/liumou_site/glpm"
)

func demo() {
	fmt.Println("=== GLPM 高级使用示例 ===")

	// 1. 使用特定包管理器
	fmt.Println("\n1. 使用特定包管理器")
	config := &glpm.ManagerConfig{
		Sudo:          true,  // 使用sudo权限
		PreferredName: "apt", // 指定使用apt包管理器
	}

	aptManager, err := glpm.GetPackageManager("apt", config)
	if err != nil {
		log.Printf("获取APT包管理器失败: %v", err)
	} else {
		if aptManager.IsAvailable() {
			fmt.Println("APT包管理器可用")

			// 获取包信息
			info, err := aptManager.Info(context.Background(), "python3")
			if err != nil {
				log.Printf("获取包信息失败: %v", err)
			} else {
				fmt.Printf("包信息: %+v\n", info)
			}

			// 检查包是否已安装
			if installed, err := aptManager.IsInstalled(context.Background(), "python3"); err == nil {
				if installed {
					fmt.Println("python3 已安装")
				} else {
					fmt.Println("python3 未安装")
				}
			}
		} else {
			fmt.Println("APT包管理器不可用")
		}
	}

	// 2. 批量操作示例
	fmt.Println("\n2. 批量操作示例")
	onlineManager, err := glpm.NewOnlinePackageManager(nil)
	if err != nil {
		log.Printf("创建在线包管理器失败: %v", err)
	} else {
		if onlineManager.IsManagerAvailable() {
			fmt.Printf("使用包管理器: %s\n", onlineManager.GetManagerName())

			// 批量安装包
			packagesToInstall := []string{"curl", "wget", "git"}
			fmt.Printf("尝试安装包: %v\n", packagesToInstall)

			// 注意：实际安装需要sudo权限，这里仅演示接口调用
			// err = onlineManager.Install(context.Background(), packagesToInstall)
			// if err != nil {
			// 	log.Printf("安装失败: %v", err)
			// } else {
			// 	fmt.Println("安装成功")
			// }

			fmt.Println("（实际安装操作已注释，避免意外安装）")
		}
	}

	// 3. 错误处理示例
	fmt.Println("\n3. 错误处理示例")

	// 尝试使用不存在的包管理器
	_, err = glpm.GetPackageManager("nonexistent", nil)
	if err != nil {
		fmt.Printf("预期错误: %v\n", err)
	} else {
		fmt.Println("意外成功获取不存在的包管理器")
	}

	// 4. 包管理器功能检测
	fmt.Println("\n4. 包管理器功能检测")

	managers := []string{"apt", "yum", "dnf", "apk", "dpkg", "rpm"}
	for _, mgrName := range managers {
		mgr, err := glpm.GetPackageManager(mgrName, nil)
		if err != nil {
			fmt.Printf("%s: 不支持\n", mgrName)
			continue
		}

		if mgr.IsAvailable() {
			fmt.Printf("%s: 可用\n", mgrName)
		} else {
			fmt.Printf("%s: 不可用\n", mgrName)
		}
	}

	// 5. 系统信息检测
	fmt.Println("\n5. 系统信息检测")

	// 检测所有可用的包管理器
	availableManagers := glpm.ListAvailableManagers()
	fmt.Printf("系统中可用的包管理器: %v\n", availableManagers)

	// 检测Linux发行版
	distro := glpm.DetectLinuxDistribution()
	fmt.Printf("检测到Linux发行版: %s\n", distro)

	// 获取推荐的包管理器
	recommended := glpm.GetRecommendedManager()
	fmt.Printf("推荐的包管理器: %s\n", recommended)

	fmt.Println("\n=== 高级示例执行完成 ===")
}
